<?php

namespace App\Logics;

use App\Service\BangCache;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;


class TagCacheLogic
{
    // laravel 自带的缓存测试
    // TODO  laravel 只有redis、memcached，但不包括 database才支持 tags

    // TODO
    //  通过缓存key制作缓存标签，生成缓存绑定操作成功
    //  但：制作绑定缓存的时候 makeBang 字段必须在模型中设置
    //   删除的时候，必须是模型中设置的缓存字段

    // laravel 的缓存
    public function cache()
    {
        $bang = new BangCache();
        $tags = ['tag1', 'tag2'];
        Cache::add('name1', 'value2');
        Cache::put('name2', 'value2');

        $bang->addTag('tag1', 'name1');
        $bang->addTag('tag1', 'name2');
        $bang->addTag('tag2', 'name1');
        $bang->addTag('tag2', 'name2');

        // 查看缓存
        $name1 = Cache::get('name1');
        $name2 = Cache::get('name2');
        var_dump($name1);

        // 删除 标签
        $bang->deleteTag('tag1');

        // 查看缓存
        $name1 = Cache::get('name1');
        $name2 = Cache::get('name2');
        var_dump($name1);
    }

    // 查询数据：一条
    public function find($table, $where)
    {
        $bang = new BangCache();
        $args = compact('where');
        $key  = $bang->makeCacheKey($table,'show',$args);   // 所有参数执行 key
        $info = $bang->getCache($key);
        if(!is_null($info)){
            return $info;
        }

        // 执行查询
        $info = DB::table($table)->where($where)->first();
        // 如果查询为空
        $info = is_null($info) ? [] : $info;
        // 保存缓存
        $bang->addCache($key, $info);
        // 添加绑定
        $tags = $bang->makeBang($table, $where);   // where条件制作绑定
        foreach($tags as $_tag){
            $bang->addTag($_tag, $key);
        }

        return $info;
    }

    // 查询列表
    public function lists($table, $where, $field = '*', $page = 1, $rows = 20, $order = 'id ASC')
    {
        // 缓存参数
        $bang = new BangCache();
        $args = compact('where', 'field', 'page', 'rows', 'order');
        $key  = $bang->makeCacheKey($table,'list',$args);   // 所有参数执行 key
        $list = $bang->getCache($key);
        if(!is_null($list)){
            return $list;
        }

        // 查询
        $list = DB::table($table)->where($where)->forPage($page, $rows)->orderByRaw($order)->get()->toArray();
        // 保存缓存
        $bang->addCache($key, $list);
        // 保存为绑定
        $tags = $bang->makeBang($table, $where);   // where条件制作绑定
        foreach($tags as $_tag){
            $bang->addTag($_tag, $key);
        }

        return $list;
    }


}

